package org.footballmanager.pandafootball.system.service.impl;

import org.footballmanager.pandafootball.common.BaseDao;
import org.footballmanager.pandafootball.common.annotation.SystemServiceLog;
import org.footballmanager.pandafootball.common.constants.Constants;
import org.footballmanager.pandafootball.system.domain.BaseEntity;
import org.footballmanager.pandafootball.system.service.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import tk.mybatis.mapper.entity.Example;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * 服务抽象类
 * 用于抽象出一些已知的服务，如根据主键获取唯一记录、保存记录等方法
 * 继承此类可以省去 大部分重复代码
 *
 * @author chenjian
 * @since 2017年9月27日上午10:57:28
 */
public abstract class ServiceImpl<T extends BaseEntity> implements BaseService<T> {
	@Autowired
	BaseDao<T> baseDao;

	/**
	 * 根据主键获取唯一记录
	 * @param id 参数
	 * @return 返回值
	 */
	@Override
	@SystemServiceLog(description = "根据主键获取唯一记录")
	public T get(Serializable id){
		return baseDao.selectByPrimaryKey(id);
	}

	/**
	 * 保存记录
	 * @param entity 参数
     *@param request 参数  @return 返回值
	 */
	@Override
	@Transactional
	@SystemServiceLog(description = "保存记录")
	public int save(T entity, HttpServletRequest request){
	    if(request != null){
            entity.setCreateId((Long)request.getSession().getAttribute(Constants.USERID));
            entity.setUpdateId((Long)request.getSession().getAttribute(Constants.USERID));
        }else{
	        entity.setCreateId(1L);
            entity.setUpdateId(1L);
        }
		entity.setCreateTime(new Date());
		entity.setUpdateTime(new Date());
		return baseDao.insert(entity);
	}

	/**
	 * 删除记录
	 * @param id 参数
	 * @param request 参数
	 * @return 返回值
	 */
	@Override
	@Transactional
	@SystemServiceLog(description = "删除记录")
	public int delete(Serializable id, HttpServletRequest request){
		T entity = baseDao.selectByPrimaryKey(id);
		entity.setDelFlag(1);
		if(request != null){
            entity.setDelId((Long)request.getSession().getAttribute(Constants.USERID));
        }else{
            entity.setUpdateId(1L);
        }
		entity.setDelTime(new Date());
		return baseDao.updateByPrimaryKey(entity);
	}

	/**
	 * 更新所有字段
	 * @param entity 参数
	 * @param request 参数
	 * @return 返回值
	 */
	@Override
	@Transactional
	@SystemServiceLog(description = "更新所有字段")
	public int updateAll(T entity, HttpServletRequest request){
        if(request != null){
            entity.setUpdateId((Long)request.getSession().getAttribute(Constants.USERID));
        }else{
            entity.setUpdateId(1L);
        }
		entity.setUpdateTime(new Date());
		return baseDao.updateByPrimaryKey(entity);
	}

	/**
	 * 更新非空字段
	 * @param entity 参数
	 * @param request 参数
	 * @return 返回值
	 */
	@Override
	@Transactional
	@SystemServiceLog(description = "更新非空字段")
	public int updateNotNull(T entity, HttpServletRequest request){
        if(request != null){
            entity.setUpdateId((Long)request.getSession().getAttribute(Constants.USERID));
        }else{
            entity.setUpdateId(1L);
        }
		entity.setUpdateTime(new Date());
		return baseDao.updateByPrimaryKeySelective(entity);
	}

	/**
	 * 获取所有记录
	 * @return 返回值
	 */
	@Override
	@SystemServiceLog(description = "获取所有记录")
	public List<T> getall(){
		return baseDao.selectAll();
	}

	/**
	 * 根据条件获取记录
	 * @param example 条件
	 * @return 返回值
	 */
	@Override
	@SystemServiceLog(description = "根据条件获取唯一记录")
	public T findByExample(Example example){
		List<T> list = baseDao.selectByExample(example);
		if(list != null && !list.isEmpty()){
			return list.get(0);
		}
		return null;
	}

    /**
     * 根据条件获取符合记录
     * @param example 条件
     * @return 记录列表
     */
	@Override
	@SystemServiceLog(description = "根据条件获取符合记录")
	public List<T> findall(Example example) {
		if(example == null){
			return this.getall();
		}
		return baseDao.selectByExample(example);
	}

    /**
     * 根据条件获取记录数量
     * @param example 条件
     * @return 数量
     */
	@Override
	@SystemServiceLog(description = "根据条件获取记录数量")
	public int countByCondition(Example example) {
		return baseDao.selectCountByExample(example);
	}

}
